// 在这个模块中，封装 axios，创建 axios 实例对象

// 1. 导入 axios
import axios from 'axios'
// 导入 Store 的函数
import useUserStore from '../store/userStore'
// 在 js 模块中，想要实现导航跳转，只能导入路由的 router 实现
import router from '../router'
import { ElMessage } from 'element-plus'

// 2. 创建 axios 实例对象
const instance = axios.create({
  // baseURL 是接口的请求根路径
  // baseURL: 'http://127.0.0.1:3000/'
  baseURL: 'http://47.105.62.192:3000/'
})

// Add a request interceptor
instance.interceptors.request.use(
  function (config) {
    // Do something before request is sent
    // 为有权限的接口，统一挂载 token 字段
    if (config.url !== '/login/phone' && !config.url.startsWith('/getCode/')) {
      config.headers.Authorization = useUserStore().token
    }
    return config
  },
  function (error) {
    // Do something with request error
    return Promise.reject(error)
  }
)

// Add a response interceptor
instance.interceptors.response.use(
  function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    // 在响应拦截器中，把 response.data 返回给组件，
    // 这样，组件中拿到的 result 就不再是“套壳后”的结果了，而是服务器返回的“原数据”
    return response.data
  },
  function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error
    if (error.status === 401) {
      // 本次接口调用，发送到服务器端的 token 无效
      // 1. 去登录页
      router.push('/login')
      // 2. 清空 store，把无效的 token 重置为空
      useUserStore().$reset()
      // 3. 提示用户：登录过期，请重新登录！
      ElMessage.warning('登录过期，请重新登录！')
    }

    return Promise.reject(error)
  }
)

// 3. 默认导出步骤2创建的 axios 实例对象
export default instance
